Спринт 2/18 → Тема 5/6: Требования к коду → Урок 5/7
Пакеты и модули
Скачайте модуль start_game_banner.py. Создайте в корневой директории проекта character_creation_module/ папку graphic_arts/. Добавьте в эту папку только что скачанный модуль. Структура проекта должна получиться такой:
Модуль добавлен, но пока он сам по себе, то есть не подключён к проекту, а значит, посмотреть во всей красе на его работу не получится. Итак, пора разобраться, что же вообще такое модуль и как подключить его к проекту.
Что такое модуль
Когда над проектом работает несколько программистов, обычно каждый отвечает за свою часть кода. Если все будут работать в одном файле, рано или поздно это приведёт к проблемам. Например, разные разработчики могут дать одинаковые имена переменным, это приведёт к конфликту имён, и программа будет работать не так, как ожидалось. Также в коде такого проекта может оказаться несколько функций, которые отвечают за одно и то же, и сразу отследить это не получится. А как же
DRY?Чтобы избежать подобных ситуаций, программисты разбивают проект на модули.
Модуль в Python — это отдельный файл с расширением .py, который содержит код программы.
Модули можно разделить на три типа:
- модули стандартной библиотеки Python,
- сторонние модули,
- пользовательские модули.
С модулями стандартной библиотеки Python вы уже работали. Например, вы сталкивались с модулем
datetime.В стандартной библиотеке содержатся модули, написанные на
Cи, которые отвечают за доступ к системным функциям, например функциям ввода-вывода. Без подобных модулей программисты на Python не смогли бы пользоваться этими функциями. Также в стандартной библиотеке есть модули, написанные на Python. Они помогают решать многие задачи, с которыми ежедневно сталкиваются разработчики на Python. Например, модуль datetime предоставляет инструменты управления значениями даты и времени.Сторонние модули — это модули, которые написали другие разработчики. Такие модули можно установить через пакетный менеджер или скачать с GitHub.
Сторонние модули чаще всего пишут для того, чтобы расширить возможности стандартной библиотеки, например, для работы с искусственным интеллектом, графикой, интерфейсами устройств.
Такие модули помогают писать код быстрее, ведь нет необходимости «придумывать велосипед». Достаточно заглянуть на GitHub и поискать то, что нужно в данный момент. Также сторонние модули можно изменять под свои нужды и предлагать включать эти изменения в исходный код.
Пользовательские модули — это файлы с кодом, которые разработчик создаёт самостоятельно для конкретного проекта.
Подключение модулей
В каждом модуле содержатся свои функции и переменные. Эти функции и переменные можно импортировать из модуля в основной код программы.
В проекте character_creation_module вы использовали возможности модуля стандартной библиотеки
random: подключали из него функцию randint. PYTHON
По такому же принципу можно подключать функции из сторонних и пользовательских модулей.
Например, у вас есть два модуля, которые находятся в одной директории:
- первый содержит две функции: одна функция складывает два числа, а вторая — вычитает одно число из другого:
PYTHON
- второй модуль обрабатывает и преобразует в число значения, которые пользователь вводит в терминал:
PYTHON
Задача — использовать функции сложения и вычитания из первого модуля во втором модуле, чтобы обработать те данные, которые введёт пользователь. Конечно, можно просто дописать код во втором модуле, и дело сделано. Но зачем писать код, который уже кто-то написал за вас? Импортируем функции из первого модуля во второй:
PYTHON
Программа готова, и вам не пришлось переносить код из одного модуля в другой. Практично.
Папка с модулями — это пакет
Когда проект начинает разрастаться, разработчики для удобства собирают общие по тематике модули в одну папку внутри проекта. Такая папка называется пакетом (англ. package). В стандартной библиотеке тоже есть пакеты модулей, например, пакет
email объединяет несколько модулей для управления сообщениями электронной почты. В каждый пакет рекомендуется добавлять файл
__init__.py. В официальной документации нет чёткого указания использовать этот файл, но он может быть полезен.Например, в этот файл можно добавить описание пакета. У пакета
email из стандартной библиотеки Python описание в __init__.py выглядит так PYTHON
Описание поможет вам или другим разработчикам быстро понять, для чего используются модули из пакета. Также описанные в пакете модули отображаются в подсказке в редакторе кода при импорте. Всё на виду — не нужно заглядывать внутрь пакета, чтобы понять, какие у него есть возможности.
Библиотека
В курсе вы довольно часто сталкивались с понятием «стандартная библиотека Python». Но что же такое библиотека? Разбираемся.
Библиотека — это совокупность модулей и пакетов, которые решают задачу в одной предметной области. Например, стандартная библиотека Python — это набор модулей и пакетов для решения популярных задач, с которыми ежедневно встречаются разработчики на Python. Не нужно писать код с нуля — достаточно подключить в проект готовый модуль или пакет. Удобно.
Есть и другие библиотеки, но всему своё время. Пока что для учёбы вам будет вполне достаточно стандартной библиотеки.
☝ Модуль — это python-файл, который содержит переменные, функции, классы и исполняемый код. Модули могут быть объединены в пакеты, а пакеты и модули, которые решают задачу в одной предметной области, — в библиотеки.
Вернёмся к проекту
Итак, сейчас в вашем проекте есть два модуля:
- модуль main.py, он отвечает за создание персонажа игры;
- модуль start_game_banner.py, который отвечает за анимацию.
Ваша задача — подключить модуль анимации к модулю создания персонажа игры.
Откройте файл main.py и доработайте в нём код:
PYTHON
Теперь запустите программу командой:
BASH
Вероятно, не всё пойдёт по плану…
BASH
Ошибка. Она говорит, что модуля с именем
asciimatics нет ни в виртуальном окружении, ни в файлах проекта.Модуль
asciimatics — сторонний. Чтобы всё заработало, его нужно установить в виртуальное окружение вашего проекта через пакетный менеджер. Сделайте это:BASH
Теперь
asciimatics будет находиться в директории Windows —/Lib/site-packages/, Linux/MacOS — /Lib/версия_python/site-packages/ вашего виртуального окружения venv вместе с остальными установленными пакетами и библиотеками. Снова запустите программу и посмотрите на результат.
if __name__ == '__main__'
Модули Python можно запускать как самостоятельные программы, а можно импортировать их целиком или только функции из них в другие модули.
Когда модуль запускается как самостоятельная программа, выполняется весь код целиком, как и полагается в интерпретаторе: построчно, команда за командой.
Возьмём для примера модуль module1.py с функцией
special_calculation, которая складывает два числа и от их суммы отнимает 2:PYTHON
Если запустить этот модуль, то последовательно выведутся все принты:
BASH
Функция
special_calculation хоть и простая, но вполне может пригодиться и в другом модуле, например в module2.py. Тогда будет достаточно импортировать эту функцию, заново код переписывать не придётся:PYTHON
Результат выполнения программы будет таким:
BASH
Из вывода видно, что сначала вывелись результаты вызова функций, которые выполнялись в module1.py, а затем те, что выполнялись в module2.py. Вся эта информация нам ни к чему. Нам нужен только тот вывод, который относится к файлу module2.py.
В таких ситуациях следует использовать специальную конструкцию —
if __name__ == '__main__'. Код, размещённый в теле этой конструкции, выполняется только тогда, когда модуль запускается как самостоятельная программа. То есть это «личный» код модуля.Работает эта конструкция так. При запуске кода инициализируется специальная переменная
__name__, по которой интерпретатор определяет, импортирован модуль или нет. Если модуль запускается как самостоятельная программа, то этой переменной присваивается значение
'__main__'. Если же модуль импортируется, то значение этой переменной равно названию модуля, в которую импортирован код.Значит, если в модуле module1.py убрать код, который отвечает за вывод результата на печать, в конструкцию
if __name__ == '__main__'...PYTHON
…то при запуске модуля как самостоятельной программы вывод на печать состоится…
BASH
…а при импорте функции
special_calculation() в модуль module2.py ничего лишнего не распечатается:BASH
В учебном проекте character_creation_module в модуле main.py есть функция
main(). Эта функция отвечает за приветствие игрока. Такая функция нужна только при запуске конкретно этого модуля, в остальных случаях она навряд ли пригодится, а вот другие функции из модуля могут понадобиться. Чтобы приветствие не выводилось когда ни попадя, следует вынести его под if __name__ == '__main__'. Сделайте это:PYTHON
На работоспособность вашей программы такие манипуляции не повлияют. Убедитесь в этом: запустите проект, всё должно работать, как и прежде.
Модули, пакеты, библиотеки — теперь эти слова обрели для вас смысл. Базовые понятия программирования — фундамент знаний хорошего разработчика.